#pragma once

#include "RtmpPuller2.h"
extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavutil/avutil.h"
#include "libswscale/swscale.h"
#include "libavutil/opt.h"
#include "libavutil/imgutils.h"
#include "libswresample\swresample.h"
};

class AACDecoder :public RtmpPuller2::RtmpPullObserver {
public:
	enum DECODE_STATUS {
		RUNNING = 1,
		STOP = 2,
		PAUSE = 3,
		FAIL = 4,
		NOSOURCE = 6,
	};
	class AACDecoderObserver {
	public:
		virtual int OnAudioDecode(uint8_t *dat, uint16_t size) { return 0; };
	};
	void OnRtmpFrame(void * dat, uint32_t size);
	AACDecoder();
	AACDecoder(AVStream *p);
	int Decode(uint8_t *dat,uint16_t);
	int SetObserver(AACDecoderObserver *);
private:
	AVFormatContext *mFormatCtx = nullptr;
	AVCodecContext  *mCodecCtx = nullptr;
	AVCodec         *mCodec = nullptr;
	AVPacket		*mPacket = nullptr;
	uint16_t		mSampleCnt;
	enum AVSampleFormat mSampleFmt;
	uint16_t	mSampleRate;
	uint16_t	mChannel;
	uint64_t	mChannelLayout;
	AVFrame *mPcmDat;
	uint8_t *mU16Data;
	AACDecoderObserver *mObserver;
	DECODE_STATUS mStatus;
	SwrContext * mSwrCtx;
};
